import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)

/**
 * Objeto que representa al jugador que solo se mueve de arriba hacia abajo
 * 
 * @author Cesar Delgado
 */
public class JetMan extends Actor
{
    private int metrosRecorridos;
    private int cont;
    private World mundo;
    private GreenfootImage imagen1;
    private GreenfootImage imagen2;
    private GreenfootImage imagen3;
    private GreenfootImage imagen4;
    private boolean vivo;
    private int contMonedas;
    
    /**
     * Constructor para la clase JetMan, carga a memoria
     * las imagenes que va a utilizar
     */
    public JetMan()
    {
        imagen1 = new GreenfootImage("Diddy_Kong.png");
        setImage(imagen1);
        imagen2 = new GreenfootImage("Diddy_Kong2.png");
        imagen3 = new GreenfootImage("Diddy.png");
        imagen4 = new GreenfootImage("diddyrun.png");
        
        vivo = true;
        contMonedas = 0;
        cont = 0;
    }
    
    /**
     * Act - Hace lo que sea que JetMan quiera hacer. Este metodo es llamado 
     * cuando el  boton "run" o "act" son presionados
     */
    public void act() 
    {
        ScrollWorld mundo = (ScrollWorld)getWorld();
        if( mundo.dimeOpcion() == 2)
        {
           cont++;
           if(cont == 4)
            setImage(imagen1);
            
           if(cont == 8)
             setImage(imagen2);
             
           if(cont >= 10)
              cont = 0;
        }
        else
        
        if(mundo.dimePause() == false)
        {
           if( vivo == true )
           {
          
              volar();
           
              if(getY() >= 350 )
                 correr();
        
              recogerMonedas();
        
              if( impacto() == true )
           
                 vivo = false;
           }
           else
              morir();
      
        }
    }
    
    /**
     * Este metodo es llamado cuando JetMan esta en el aire
     * y se eleva si se presiona la tecla hacia arriba 
     * o cae por efecto de la gravedad
     */
    private void volar()
    {
        ScrollWorld mundo = (ScrollWorld)getWorld();
        
        if (Greenfoot.isKeyDown("up") && getY()>65) 
        {
           mundo.jetpack.play();
           cont++;
           setLocation (getX(), getY() - 6);
           
           if(cont == 4)
            setImage(imagen1);
            
           if(cont == 8)
             setImage(imagen2);
             
           if(cont >= 10)
              cont = 0;
        }
        
        else
        {
           mundo.jetpack.stop();
           
           if (getY() < 350)
              setLocation (getX(), getY() + 6);
        }
    }
    
    /**
     * Crea la animacion cuando JetMan es tocado por un obstaculo
     */
    private void morir()
    {
        ScrollWorld mundo = (ScrollWorld)getWorld();
        if(getY() < 350)
        {
           setLocation (getX() + 10, getY() + 10);
           turn(10);
           cont++;
        }
        else
        {
           if(cont > 0)
           {
               setLocation (getX() + 10, getY() );
               turn(10);
               cont--;
           }
           if( cont == 0)
           {
               
               mundo.finJuego();
               cont--;
           }
        }
    }
    
    /**
     * Checa si una moneda para recolectar, en caso afirmativo la elimina del mundo
     */
    private void recogerMonedas()
    {
         ScrollWorld mundo = (ScrollWorld)getWorld();
         
         Coin moneda = (Coin)getOneObjectAtOffset(5,5,Coin.class);
         {
             if( moneda != null )
             {
                contMonedas++;
                if(contMonedas == 1 )
                {
                   mundo.coin3.stop();
                   mundo.coin1.play();
                }
                   
                if(contMonedas == 2)
                {
                   mundo.coin1.stop();
                   mundo.coin2.play();
                }
                   
                if(contMonedas == 3)
                {
                   mundo.coin2.stop();
                   mundo.coin3.play();
                   contMonedas = 0;
                }
                
                
                mundo.removeObject(moneda);
                mundo.actualizaMonedas();
             }
         }
    }
    
    /**
     * Este metodo e llamado cuando JetMan se encuentra en el suelo
     * y da el efecto de correr
     */
    private void correr()
    {
        cont ++;
        
        if(cont == 5)
            setImage(imagen3);
            
        if(cont == 10)
             setImage(imagen4);
            
        if(cont >= 13)
           cont = 0;
    }
    
    /**
     * Dice si JetMan colisiono con un obstaculo
     * @param true cuando impacto y false cuando no impacto
     */
    private boolean impacto()
    {
        ScrollWorld mundo = (ScrollWorld)getWorld();
         
        Obstaculo obs = (Obstaculo)getOneObjectAtOffset(20,20,Obstaculo.class);
        if( obs != null && obs.activo() == true)
           return true;
        else
           return false;
    }
}
